package cn.mhome.merchant.util;

import java.io.UnsupportedEncodingException;

/**
 * 字符串操作工具类
 * @author lijin
 * @since 2014/4/10
 */
public class StringUtils{

	public static boolean isBlank(String obj){
		return obj == null || obj.trim().equals("");
	}
	
	public static byte[] toBytes(String s) {
		try {
			return s != null ? s.getBytes("UTF-8") : null;
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e);
		}
	}

	public static boolean isEmpty(String s) {
		return (s == null || "".equals(s.trim()));

	}

	public static String toStr(byte[] b) {
		try {
			return b != null ? new String(b, "UTF-8") : null;
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 获取字符串的长度，中文占一个字符,英文数字占半个字符
	 * 
	 * @param value
	 *            指定的字符串
	 * @return 字符串的长度
	 */
	public static double strLength(String value) {
		double valueLength = 0;
		String chinese = "[\u4e00-\u9fa5]";
		// 获取字段值的长度，如果含中文字符，则每个中文字符长度为2，否则为1
		for (int i = 0; i < value.length(); i++) {
			// 获取一个字符
			String temp = value.substring(i, i + 1);
			// 判断是否为中文字符
			if (temp.matches(chinese)) {
				// 中文字符长度为1
				valueLength += 1;
			} else {
				// 其他字符长度为0.5
				valueLength += 0.5;
			}
		}
		// 进位取整
		return Math.ceil(valueLength);
	}

	/**
	 * 字符串连接
	 * 
	 * @param strs
	 * @return
	 */
	public static String contactString(String... strs) {
		StringBuilder sb = new StringBuilder();
		for (String str : strs) {
			sb.append(str);
		}
		return sb.toString();
	}

	public static String asciiReverse(String data) {
		if (data == null)
			return null;

		int len = data.length();

		if (len == 0)
			return data;

		StringBuilder str_buf = new StringBuilder(len);
		for (int i = 0; i < len; i++) {
			char in = data.charAt(i);
			byte b = (byte) in;
			if (b >= 0 && b < 128) {
				in = (char) (127 - in);
			}
			str_buf.append(in);
		}

		return str_buf.toString();
	}

	/**
	 * 按指定长度裁减字符串用于显示（英文字符1,中文字符2） note:
	 * 函数对中文做了特殊处理，因此如果输入中含有中文，应该调用此函数，否则，直接通过String的length操作判断
	 * 
	 * @param str
	 * @param splitLen
	 * @return
	 */
	public static String splitDisplayString(String str, int splitLen) {
		if (str == null)
			return null;

		char[] result = new char[splitLen];
		int dislpayLen = 0;
		int j = 0;
		int len = str.length();
		for (int i = 0; i < len; ++i) {
			char ch = str.charAt(i);
			if (ch > '\u00FF')
				dislpayLen = dislpayLen + 2;
			else
				dislpayLen++;
			if (dislpayLen <= splitLen)
				result[j++] = ch;
			else
				break;
		}
		return new String(result, 0, j);
	}


	/**
	 * 计算字符串字节数（英文字符1,中文字符2） note:
	 * 函数对中文做了特殊处理，因此如果输入中含有中文，应该调用此函数，否则，直接通过String的length操作判断
	 * 
	 * @see #getStrLength(String)
	 * @deprecated
	 */
	public static int displayLength(String str) {
		return getStrLength(str);
	}

	/**
	 * 验证一个可能含有中文的字符串长度是否在指定的长度范围内 note:
	 * 函数对中文做了特殊处理，因此如果输入中含有中文，应该调用此函数，否则，直接通过String的length操作判断
	 * 
	 * @param str
	 * @param maxLength
	 * @return 如果大于最大值，则返回false，否则返回true
	 */
	public static boolean validateMaxLength(String str, int maxLength) {
		int length = str.length();

		// 只有字符串在最大长度和最大长度的1/2之间才去获取实际长度
		if (length <= maxLength && length > maxLength / 2) {
			return !(StringUtils.displayLength(str) > maxLength);
		}
		return (length <= maxLength);
	}

	/**
	 * 功能：获取字符串长度，一个汉字等于两个字符
	 * 
	 * @param str
	 *            字符串
	 * @return 字符串长度
	 */
	public static int getStrLength(String str) {
		if (str == null || str.length() == 0)
			return 0;
		int count = 0;
		for (char c : str.toCharArray()) {
			count += c < 256 ? 1 : 2;
		}
		return count;
		// int bytes = 0; // 用来存储字符串的总字节数
		// for (int i = 0; i < str.length(); i++) {
		// char c = str.charAt(i);
		// if (c < 256) {
		// bytes += 1; // 英文字符的字节数看作1
		// } else {
		// bytes += 2; // 中文字符的字节数看作2
		// }
		// }
		//
		// return bytes;
	}

	/**
	 * 验证一个可能含有中文的字符串长度是否在指定的长度范围内 note:
	 * 函数对中文做了特殊处理，因此如果输入中含有中文，应该调用此函数，否则，直接通过String的length操作判断
	 * 
	 * @param str
	 * @param minLength
	 * @return 如果小于最小值，则返回false，否则返回true
	 */
	public static boolean validateMinLength(String str, int minLength) {
		int length = str.length();

		if (length >= minLength)
			return true;
		// 只有字符串在最大长度和最大长度的1/2之间才去获取实际长度
		if (length < minLength && length >= minLength / 2) {
			return !(StringUtils.displayLength(str) < minLength);
		}
		return (length > minLength);
	}


	/**
	 * 去掉前后空格
	 * 
	 * @param content
	 * @return
	 */
	public static String trim(String content) {
		if (null != content) {
			return content.trim();
		}
		return content;
	}


	public static void main(String a[]) {
		System.out.println(StringUtils.strLength("qweqwe第三方123qwe"));
	}

}